408. Однородный генератор
Псевдослучайные числа можно сгенерировать при помощи формулы:
seed(x + 1) = (seed(x) + STEP)
% MOD,
где % – операция взятия
остатка. Недостаток такого метода получения случайных чисел состоит в том, что
циклически будет генерироваться одна и та же последовательность. Например, если
STEP = 3 и MOD = 5, то циклически будет повторяться последовательность 0, 3, 1,
4, 2. Если STEP = 15 и MOD = 20, то получим серию чисел 0, 15, 10, 5.
Выяснить, можно при помощи
такого генератора получить все числа от 0 до MOD – 1.
Вход. Каждая строка содержит два числа: STEP и MOD (1 £ STEP, MOD £ 100000).
Выход. Для
каждого теста вывести значение STEP в колонках от 1 до 10, выровненное справа,
значение MOD в колонках от 11 до 20, выровненное справа, и фразу
‘Good Choice‘ или ‘Bad Choice‘, начиная с колонки 25. Если по входным STEP и
MOD будут сгенерированы все числа от 0 до MOD – 1, то выводить фразу ‘Good
Choice‘. Иначе следует выводить фразу ‘Bad Choice‘. После вывода результата для
каждого теста выводить пустую строку.
3 5
15 20
63923 99999
3 5
Good Choice
15 20
Bad Choice
63923
99999 Good Choice
элементарные вычисления
Положим seed(0) = 0. Если будут сгенерированы по выше приведенной формуле
все числа от 0 до MOD – 1, то seed(i) ¹ 0, i = 1, 2, …, MOD – 1. При этом seed(MOD) = 0. Фразу ‘Bad Choice‘ следует выводить, если
существует такое i, 1 £ i £ MOD – 1, что seed(i)
= 0.
Читаем входные значения STEP и MOD. Положим seed = 0. Совершим MOD – 1 итераций генерирования псевдослучайных чисел. Если
хотя бы на одном этапе получится seed = 0, то все числа от 0 до MOD – 1 сгенерированы не будут и следует вывести ‘Bad Choice’. Иначе – ‘Good Choice‘.
while(scanf("%d
%d",&step,&mod) == 2)
{
seed = 0;
for(i = 0; i < mod - 1; i++)
{
seed = (seed +
step) % mod;
if (!seed) break;
}
if (i == mod - 1) printf("%10d%10d Good Choice\n\n",step,mod);
else printf("%10d%10d Bad Choice\n\n",step,mod);
}